#ifndef _M_LOG_CACHE_SERVER_H_
#define _M_LOG_CACHE_SERVER_H_

#include "m_log_backend_interface.h"
#include "mfc/mfc_rb_block_queue.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 服务输入参数
 */
typedef struct TMLogBackendCacheSrvCompParamTag TMLogBackendCacheSrvCompParam;
struct TMLogBackendCacheSrvCompParamTag
{
    /// 当其中一个ringqueue 数据量 >= 1/4 流控，数据从缓存写入到flash
    UInt8 store_max;                    ///< 流控，每次执行runonce，最多存储多少项flash队列,store_max为0时忽略不计，全部写入
    UInt8 flush_intv;                   ///< 最长多久时间将cache写入到flash  单位S 建议5-6s
    
    TMLogData *high_prio_items;         ///< 警告及以上等级queue 数据buffer
    TMLogData *low_prio_items;          ///< 警告以下等级queue 数据buffer
    UInt16 high_prio_item_count;        ///< 警告及以上等级queue  数据项数
    UInt16 low_prio_item_count;         ///< 警告以下等级queue  数据项数
};

/**
 * 轻日志缓存服务对象
 */
struct TMLogBackendCacheSrvCompTag
{
    TMfRbBlockQueue queue_[2];         ///< cache存储队列
    IMLogBackend mlog_interface_;      ///< 日志输出端接口
    IMLogBackend *queue_interface_;    ///< flash队列接口

    UInt8 cache_store_max_;            ///< flash最大流控
    UInt8 cache_flush_store_;          ///< flush刷新流控，为store_max 的 3/4 
    UInt32 cache_flush_intv_;           ///< 最长多久时间将cache写入到flash  单位ms flush_intv * 1000

    Bool cache_flush_run_;
    UInt32 last_flush_tick_;
};
typedef struct TMLogBackendCacheSrvCompTag TMLogBackendCacheSrvComp;

/**
 * 轻日志缓存服务构造
 * @param self: 对象指针
 * @param param: 参数
 * @param queue_backend: 队列后端适配层接口
 * @return
 */
void TMLogBackendCacheSrvCompCreate(TMLogBackendCacheSrvComp *self, const TMLogBackendCacheSrvCompParam *param, 
    IMLogBackend *queue_backend);

/**
 * 运行
 * @param self: 对象指针
 * @return
 */
void TMLogBackendCacheSrvCompRunOnce(TMLogBackendCacheSrvComp *self);

/**
 * 轻日志缓存服务析构
 * @param self: 对象指针
 * @return
 */
void TMLogBackendCacheSrvCompDestroy(TMLogBackendCacheSrvComp *self);

/**
 * 获取MLog适配层接口
 * @param self: 对象指针
 * @return
 */
IMLogBackend *TMLogBackendCacheSrvCompInterface(TMLogBackendCacheSrvComp *self);

/**
 * 设置后端队列输出接口
 * @param self: 对象指针
 * @param queue_backend: 队列后端适配层接口
 * @return
 */
Bool TMLogBackendCacheSrvCompSetBackend(TMLogBackendCacheSrvComp *self, IMLogBackend *queue_backend);

#ifdef __cplusplus
} // extern "C" {
#endif
#endif
